#include <iostream>
#include <string>

using namespace std;

/*
    使用引用传参的好处

    以往使用指针 调用传参的时候 需要取地址
    然后在函数内部 需要解指针
*/

// 函数 func_swap_1：值传递方式交换两个整数
// 由于是值传递，函数内部的操作是对形参的操作，不会影响实参的值
void func_swap_1(int val_1, int val_2)
{
    int temp = val_1;
    val_1 = val_2;
    val_2 = temp;
    // 交换了 val_1 和 val_2 的值，但只是交换了形参的值，实参不受影响
}

// 函数 func_swap_2：指针传递方式交换两个整数
// 通过指针传递参数，需要取地址作为参数，函数内部需要解引用操作
void func_swap_2(int *val_1, int *val_2)
{
    int temp = *val_1;  // 解引用 val_1 指针，获取其指向的值
    *val_1 = *val_2;  // 解引用 val_2 指针，将 val_2 指向的值赋给 val_1 指向的值
    *val_2 = temp;   // 将 temp 的值赋给 val_2 指向的值
    // 交换了 val_1 和 val_2 所指向的实参的值
}

// 函数 func_swap_3：引用传递方式交换两个整数
// 通过引用传递参数，不需要取地址和解引用操作，直接操作引用所代表的实参
void func_swap_3(int &val_1, int &val_2)
{
    int temp = val_1;  // 直接使用引用操作实参
    val_1 = val_2;    // 交换引用所代表的实参的值
    val_2 = temp;    // 交换引用所代表的实参的值
}

int main(int argc, char const *argv[])
{
    int val_1 = 80;
    int val_2 = 60;

    // 值传递
    func_swap_1(val_1, val_2);
    // 输出未交换的值，因为 func_swap_1 是值传递，不影响 val_1 和 val_2 的原始值
    cout << val_1 << " " << val_2 << endl;  

    // 指针传递
    val_1 = 80;
    val_2 = 60;
    func_swap_2(&val_1, &val_2);
    // 输出交换后的值，因为 func_swap_2 通过指针修改了 val_1 和 val_2 的值
    cout << val_1 << " " << val_2 << endl;  

    // 引用传递
    val_1 = 80;
    val_2 = 60;
    func_swap_3(val_1, val_2);
    // 输出交换后的值，因为 func_swap_3 通过引用修改了 val_1 和 val_2 的值
    cout << val_1 << " " << val_2 << endl;  

    return 0;
}